/** @file attributes.h
 *  @version 1
 */

#include <stdio.h>

#define INT_TYPE 1
#define DOUBLE_TYPE 2
#define FLOAT_TYPE 3
#define CHAR_TYPE 4

#define INT_SIZE 4
#define DOUBLE_SIZE 8
#define FLOAT_SIZE 4
#define CHAR_SIZE 1

// atributos de tipo
typedef struct attr_tipo {
	int tipo;
	int size;
} attr_tipo;

//
typedef struct attr_listadupla {
	int* inicio;      // limite inferior de i
	int  n_dimensoes; // numero de dimensoes
	int* tamanho;     // tamanho dimensao i
	int  n_elementos; // numero de elementos
} attr_listadupla;

//
typedef struct attr_tipocomposto {
	int  tipo;    // tipo de cada elemento
	int  tamanho; // tamanho total ocupado (# elementos * w)
	int  w;       // tamanho de cada elemento
	attr_listadupla* lista;  // lista das dimensoes
} attr_tipocomposto;

typedef struct attr_array {
	int c;
	int n_dimensoes;
	int* tamanho;
	int w;
} attr_array;

// atributos de expressoes
typedef struct attr_expr {
	char* local;
	struct node_tac* code;
	int tipo;
} attr_expr;

typedef struct attr_listaexpr {
	int tamanho;
	attr_expr** expr;
} attr_listaexpr;

// atributos de expressoes booleanas
typedef struct attr_exprbool {
	char* t;
	char* f;
	struct node_tac* code;
} attr_exprbool;